package com.mlethe.library.multi.api;

import com.mlethe.library.multi.api.listener.OnActionCallback;
import com.tencent.mobileqq.openpay.api.IOpenApiListener;
import com.tencent.mobileqq.openpay.data.base.BaseResponse;
import com.tencent.mobileqq.openpay.data.pay.PayResponse;

import java.util.HashMap;
import java.util.Map;

/**
 * QQ支付回调监听
 *
 * @Author Mlethe
 * @Date 2023/3/15
 */
final class QQPayHandler implements IOpenApiListener {

    private OnActionCallback mOnActionCallback;

    public QQPayHandler(OnActionCallback callback) {
        this.mOnActionCallback = callback;
    }

    /**
     * apiMark int 执行的Api标识
     * apiName String 执行的Api名称
     * retCode int 支付结果代码，0 ： 表示成功。非0：表示失败
     * retMsg String 支付结果描述，仅支付成功有效
     * serialNumber String 支付序号,用于标识此次支付
     * openId String 腾讯开放平台openId，注，仅开通获得openId权限的App才返回
     * transactionId String 财付通交易号(订单号)，仅支付成功有效
     * payTime String 支付时间，仅支付成功有效
     * callbackUrl String 商户提供的回调url地址（HTML5方式调用适用，其它情形为空），仅支付成功有效
     * totalFee String 订单总金额，以分为单位，仅支付成功有效
     * spData String 返回给商户的信息，商户前端可解析校验订单支付结果，仅支付成功有效，该值被URL_encode
     * <p>
     * sp_data为订单相关信息，URL_decode之后示例为：
     * attach=100001000002&bank_type=0&bargainor_id=1618339989&charset=1&fee_type=1&pay_result=0&purchase_alias=242509874&sign=C932267553D4EE236E5C24640A0B03F6&sp_billno=0311207301109290002810000107631&time_end=20130917152936&total_fee=1&transaction_id=1900000109201309170000212327
     * <p>
     * sp_data中各字段含义见下表:
     * charset 1 ：UTF-8, 2 ： GB2312
     * bank_type 银行类型:财付通支付填0
     * pay_result 支付结果： 0—成功；其它—失败
     * purchase_alias 买家唯一标识，由财付通生成。注意不同于purchase_id财付通帐户。
     * bargainor_id 卖方账号（商户spid），值等同于后台接口中的“mch_id”
     * transaction_id 财付通交易号(订单号)
     * sp_billno 商户系统内部的定单号，此参数仅在对账时提供，值等同于后台接口中的“out_trade_no”
     * total_fee 订单总金额，以分为单位
     * fee_type 现金支付币种
     * attach 商家数据包，原样返回
     * time_end 支付完成时间，格式为yymmddhhmmss，如2009年12月27日9点10分10秒表示为20091227091010。时区为GMT+8 beijing。该时间取自财付通服务器
     * sign MD5签名结果,详见“3.2商户后台签名规则” 仅此data数据包中字段参与签名
     *
     * @param response
     */
    @Override
    public void onOpenResponse(BaseResponse response) {
        OnActionCallback callback = mOnActionCallback;
        mOnActionCallback = null;
        MultiApi instance = MultiApi.getInstance();
        instance.i("QQ Pay onComplete." + response);
        if (response instanceof PayResponse) {
            PayResponse payResponse = (PayResponse) response;
            if (payResponse.isSuccess()) {
                // 支付成功
                instance.i("QQ Pay success.");
                Map<String, String> map = new HashMap<>();
                map.put("apiMark", payResponse.apiMark + "");
                map.put("apiName", payResponse.apiName);
                map.put("serialNumber", payResponse.serialNumber);
                map.put("transactionId", payResponse.transactionId);
                map.put("payTime", payResponse.payTime);
                map.put("callbackUrl", payResponse.callbackUrl);
                map.put("totalFee", payResponse.totalFee);
                map.put("spData", payResponse.spData);
                if (callback != null) {
                    callback.onComplete(MultiMedia.QQ_PAY, map);
                }
            } else {
                int code = payResponse.retCode;
                instance.i("QQ Pay fail. code=" + code);
                switch (code) {
                    case -1:
                        // 用户取消
                        if (callback != null) {
                            callback.onCancel(MultiMedia.QQ_PAY);
                        }
                        break;
                    case -2:
                        // 登录态超时
                        if (callback != null) {
                            callback.onFailure(MultiMedia.QQ_PAY, code, payResponse.retMsg);
                        }
                        break;
                    case -3:
                        // 重复提交订单
                        if (callback != null) {
                            callback.onFailure(MultiMedia.QQ_PAY, code, payResponse.retMsg);
                        }
                        break;
                    default:
                        // 未知错误
                        if (callback != null) {
                            callback.onFailure(MultiMedia.QQ_PAY, code, payResponse.retMsg);
                        }
                        break;
                }
            }
        }
    }
}
